package org.example;

import org.example.jingbian_quanjiafu.JingBian_XiaoShou;
import org.example.yulinwumei.WuMei_XiaoShou;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.*;
import java.util.concurrent.*;

public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);
    private static final JingBian_XiaoShou processor = new JingBian_XiaoShou();
    private static final WuMei_XiaoShou processor_YuLinWuMei = new WuMei_XiaoShou();
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public static void main(String[] args) {
        logger.info("程序启动");
        runJingBian(0);
        runYuLinWuMei(0);
    }

    private static void runJingBian (long initialDelaySeconds) {
        // 使用调度器调度任务
        scheduler.schedule(() -> {
            try {
                // 获取当前日期的前一天
                LocalDate date = LocalDate.now().minusDays(1);
                // 执行数据处理任务
                boolean success = processor.execute(date);

                if (success) {
                    // 如果数据处理成功，记录日志并安排下次任务在次日04:00运行
                    logger.info("数据上传成功，等待次日04:00");
                    runJingBian(secondsUntilNext4AM());
                } else {
                    // 如果数据处理失败，记录日志并安排任务在30分钟后重试
                    logger.info("30分钟后重试");
                    runJingBian(1200); // 20分钟
                }
            } catch (Exception e) {
                // 如果发生异常，记录错误日志并安排任务在10分钟后重试
                logger.error("任务调度异常", e);
                runJingBian(600);
            }
        }, initialDelaySeconds, TimeUnit.SECONDS);
    }
    private static void runYuLinWuMei (long initialDelaySeconds) {
        // 使用调度器调度任务
        scheduler.schedule(() -> {
            try {
                // 获取当前日期的前一天
                LocalDate date = LocalDate.now().minusDays(1);
                // 执行数据处理任务
                boolean success = processor_YuLinWuMei.execute(date);

                if (success) {
                    // 如果数据处理成功，记录日志并安排下次任务在次日04:00运行
                    logger.info("数据上传成功，等待次日04:00");
                    runYuLinWuMei(secondsUntilNext4AM());
                } else {
                    // 如果数据处理失败，记录日志并安排任务在30分钟后重试
                    logger.info("30分钟后重试");
                    runYuLinWuMei(1200); // 20分钟
                }
            } catch (Exception e) {
                // 如果发生异常，记录错误日志并安排任务在10分钟后重试
                logger.error("任务调度异常", e);
                runYuLinWuMei(600);
            }
        }, initialDelaySeconds, TimeUnit.SECONDS);
    }


    /**
     * 计算直到下一个凌晨4点之间的秒数。
     *
     * @return 直到下一个凌晨4点之间的秒数
     */
    private static long secondsUntilNext4AM() {
        ZoneId zone = ZoneId.systemDefault();
        ZonedDateTime now = ZonedDateTime.now(zone);
        ZonedDateTime nextRun = now.withHour(4).withMinute(0).withSecond(0);
        if (now.compareTo(nextRun) >= 0) {
            nextRun = nextRun.plusDays(1);
        }
        return Duration.between(now, nextRun).getSeconds();
    }
}